#include "entidad.h"

/*------------------------------------------------------------------------------
	Constructor
------------------------------------------------------------------------------*/
CEntidad::CEntidad()
{
	strcpy(m_sNombre,"");
	m_fX=1;
	m_fY=0;
	m_fZ=0;
	m_fRotX=0;
	m_fRotY=0;
	m_fRotZ=0;
	m_fEscalaX=1.0;
	m_fEscalaY=1.0;
	m_fEscalaZ=1.0;	
	m_aColor[0]=1.0f;
	m_aColor[1]=1.0f;
	m_aColor[2]=1.0f;	
	m_bTransparente=FALSE;
	m_pModelo=NULL;
	m_bVivo=TRUE;
}

/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CEntidad::Liberar()
{
	m_pModelo=NULL;
}
/*------------------------------------------------------------------------------
	Destructor
------------------------------------------------------------------------------*/
CEntidad::~CEntidad()
{
}

/*------------------------------------------------------------------------------
	Draws the entity
------------------------------------------------------------------------------*/
void CEntidad::Dibujar(unsigned int uiFrame)
{	
	if(m_pModelo==NULL)
		return;
	
	 // Rectabgulo de Colision
	 /*
	glPushMatrix();	
	glColor3f(m_aColor[0],m_aColor[1],m_aColor[2]);	
	glTranslatef(getX(),getY(),0);		    
	
	
   	glBegin( GL_LINES );
    	  glVertex3f( getMinX()*MOD_X, getMinY()*MOD_Y,  0.0f );
    	  glVertex3f( getMaxX()*MOD_X, getMinY()*MOD_Y,  0.0f );     
      	  glVertex3f( getMinX()*MOD_X, getMaxY()*MOD_Y,  0.0f );
    	  glVertex3f( getMaxX()*MOD_X, getMaxY()*MOD_Y,  0.0f );     
    	  
    	  glVertex3f( getMinX()*MOD_X, getMinY()*MOD_Y,  0.0f );
    	  glVertex3f( getMinX()*MOD_X, getMaxY()*MOD_Y,  0.0f );     
      	  glVertex3f( getMaxX()*MOD_X, getMinY()*MOD_Y,  0.0f );
    	  glVertex3f( getMaxX()*MOD_X, getMaxY()*MOD_Y,  0.0f );     
    glEnd( );
    glPopMatrix();	
	*/
	
	glPushMatrix();	

	glTranslatef(m_fX,m_fY,m_fZ);
	glRotatef( m_fRotX, 1, 0, 0);
	glRotatef( m_fRotY, 0, 1, 0);
	glRotatef( m_fRotZ, 0, 0, 1);
	
	glScalef(m_fEscalaX,m_fEscalaY,m_fEscalaZ);	
	
	glColor3f(m_aColor[0],m_aColor[1],m_aColor[2]);
	
	if(m_bTransparente)
	{		
		glEnable(GL_BLEND);
	}
	
//	m_pModelo->Dibujar(uiFrame);
	m_pModelo->DibujarCelShading(uiFrame);
	glPopMatrix();
	glDisable(GL_BLEND);
}

/*------------------------------------------------------------------------------
	Colision control funcion
------------------------------------------------------------------------------*/
Bool CEntidad::Colisiona(CEntidad *pEntidad)
{	
	float MinX1,MinY1,MaxX1,MaxY1;
	float MinX2,MinY2,MaxX2,MaxY2;
	
	MinX1=getX()+(getMinX()*MOD_X);
	MaxX1=getX()+(getMaxX()*MOD_X);
	MinY1=getY()+(getMinY()*MOD_Y);
	MaxY1=getY()+(getMaxY()*MOD_Y);
	
	MinX2=pEntidad->getX()+(pEntidad->getMinX()*MOD_X);
	MaxX2=pEntidad->getX()+(pEntidad->getMaxX()*MOD_X);
	MinY2=pEntidad->getY()+(pEntidad->getMinY()*MOD_Y);
	MaxY2=pEntidad->getY()+(pEntidad->getMaxY()*MOD_Y);
			
	if(	(MinX1<MaxX2) &&
		(MinX2<MaxX1) &&
		(MinY1<MaxY2) &&
		(MinY2<MaxY1))
		return TRUE;
	
	return FALSE;
}

/*------------------------------------------------------------------------------
	Colision control funcion
------------------------------------------------------------------------------*/
Bool CEntidad::Colisiona(float x,float y,float ancho,float alto)
{	
	float MinX1,MinY1,MaxX1,MaxY1;	
	float MinX2,MinY2,MaxX2,MaxY2;
	
	MinX2=x-ancho/2;//pEntidad->getX()+(pEntidad->getMinX()*MOD_X);
	MaxX2=x+ancho/2;//pEntidad->getX()+(pEntidad->getMaxX()*MOD_X);
	MinY2=y-alto/2;//pEntidad->getY()+(pEntidad->getMinY()*MOD_Y);
	MaxY2=y+alto/2;//pEntidad->getY()+(pEntidad->getMaxY()*MOD_Y);
	
	MinX1=getX()+(getMinX()*MOD_X);
	MaxX1=getX()+(getMaxX()*MOD_X);
	MinY1=getY()+(getMinY()*MOD_Y);
	MaxY1=getY()+(getMaxY()*MOD_Y);
	
						
	if(	(MinX1<MaxX2) &&
		(MinX2<MaxX1) &&
		(MinY1<MaxY2) &&
		(MinY2<MaxY1))
		return TRUE;
	
	return FALSE;
}
/*------------------------------------------------------------------------------
	Is the entity in screen?
------------------------------------------------------------------------------*/
Bool CEntidad::DentroCamara()
{
	if(getX()<(getEscenario()->getX()-1.1) ||
	   getX()>(getEscenario()->getX()+1.1))
		return FALSE;
		
	return TRUE;
}

/*------------------------------------------------------------------------------
	Calculates distance to floor
------------------------------------------------------------------------------*/
float CEntidad::getDistanciaSuelo()
{
	int celdax,celday;
	Bool fin;
	float dist=999;
	
	celdax=getEscenario()->f2celdaX(getX());
	celday=getEscenario()->f2celdaY(getY()+getMinY());
	
	fin=FALSE;
	
	while (!fin)
	{		
		if(getEscenario()->getCelda(celday,celdax)!=-1)
		{			
			dist=(getEscenario()->celda2fY(celday+1)+0.15)-float(getY()+getMinY());			
			m_fYCelda=getEscenario()->celda2fY(celday+1)+0.13;				
			fin=TRUE;
		}		
		celday++;
		if(celday>=MAX_ALTURA_BLOQUES)	
			fin=TRUE;
	}			
	return dist;	
}

/*------------------------------------------------------------------------------
	Calculates distance to a wall	
------------------------------------------------------------------------------*/
float CEntidad::getDistanciaPared()
{
	int celdax,celday,celdainic;
	Bool fin;
	float dist=999;
	
	if(getRotZ()==GRADOS_DERECHA)	
		celdax=getEscenario()->f2celdaX(getX())+1;
	else
		celdax=getEscenario()->f2celdaX(getX())-1;
	
	
	celdainic=celdax;
	celday=getEscenario()->f2celdaY(getY()+getMinY());
	
	fin=FALSE;
	while (!fin)
	{		
		if((getEscenario()->getCelda(celday-1,celdax)!=-1 && getEscenario()->EsSuelo(celdax,celday-1)) ||
 		   (getEscenario()->getCelda(celday,celdax)!=-1   && getEscenario()->EsSuelo(celdax,celday)))
		{			
			if(getRotZ()==180)
				dist=float(getX())-(getEscenario()->celda2fX(celdax)+0.15);
			else
				dist=(getEscenario()->celda2fX(celdax)-0.05)-float(getX());

			if (dist<0)
				dist=-dist;
								
			fin=TRUE;
		}
		
		if(getRotZ()==180)
		{
			celdax--;
			if(celdax<(celdainic-2))
				fin=TRUE;
		}
		else
		{
			celdax++;
			if(celdax>(celdainic+2))
				fin=TRUE;
		}			

	}			
	return dist;	
}

/*------------------------------------------------------------------------------
	sets X Rotation
------------------------------------------------------------------------------*/
void CEntidad::setRotX(float fRotX)
{
	m_fRotX=fRotX;
	if(m_fRotX>360)m_fRotX=0;
	if(m_fRotX<0)m_fRotX=360;
}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CEntidad::setRotY(float fRotY)
{
	m_fRotY=fRotY;
	if(m_fRotY>360)m_fRotY=0;
	if(m_fRotY<0)m_fRotY=360;

}
/*------------------------------------------------------------------------------
------------------------------------------------------------------------------*/
void CEntidad::setRotZ(float fRotZ)
{
	m_fRotZ=fRotZ;
	if(m_fRotZ>360)m_fRotZ=0;
	if(m_fRotZ<0)m_fRotZ=360+m_fRotZ;

}


